#include <iostream>
#include <string>
#include <mysql/mysql.h>
using namespace std;

const char* host = "localhost";          // 待连接的IP地址，如果在本地可以写localhost
const char* user = "zhu";                // 待连接的用户名，例如root
const char* passwd = "2140274814";       // 用户密码，登录mysql的密码
const char* database = "zhu1";           // 待连接的数据库名称
unsigned int port = 3306;                // MySQL服务器所监听的TCP端口
const char *unix_socket = NULL;          // 直接传递NULL即可，这里不做说明
unsigned long client_flag = 0;           // 直接设置为0即可，这里不做说明

class Mysql
{
public:
    Mysql() : result(NULL)
    {
        // MySQL对象的初始化
        if (mysql_init(mysql_socket) == NULL)     // 初始化一个MYSQL连接的实例对象,成功时返回该对象地址，失败时返回NULL
        {
            cout << "初始化失败: " << mysql_error(mysql_socket) << endl;   // mysql_error用于获取实例对象的错误信息
            exit(0);
        }
        cout << "MySQL对象初始化成功" << endl;  

        // 连接MySQL服务器
        MYSQL* sock = mysql_real_connect(mysql_socket, host, user, passwd, database, port, unix_socket, client_flag);
        if (sock == NULL)
        {
            cout << "连接失败: " << mysql_error(mysql_socket) << endl;    
            exit(0);
        }
        else
        {
            cout << "连接数据库成功..." << endl << endl;
        }
        // 使用utf8字符集编码
        mysql_set_character_set(mysql_socket, "utf8");
    }
    // 执行 SQL 语句
    bool Sql()
    {
        cout << "请输入SQL指令: ";
        getline(cin, _cmd);
        int n = mysql_query(mysql_socket, _cmd.c_str());
        if (n != 0)
        {
            cout << "语句执行失败: " << mysql_error(mysql_socket) << endl;
            return false;
        }
        return true;
    }
    // 储存结果集，成功就返回一个结果集（指向 MYSQL_RES 结构的指针）
    bool GetResult()
    {
        result = mysql_store_result(mysql_socket);
        if (result == NULL)
        {
            cout << "保存结果集合失败" << endl;
            return 0;
        }
        return 1;
    }
    // 输出结果集数据
    void GetData()
    {
        int rows = mysql_num_rows(result);
        int fields = mysql_num_fields(result);
        cout << "行: " << rows << endl;
        cout << "列: " << fields << endl;
        // 获取结果集中的列名称
        MYSQL_FIELD* fields_arry = mysql_fetch_fields(result);
        for (int i = 0; i < fields; i++)
        {
            cout << fields_arry[i].name << "\t";
        }
        cout << endl;
        // 获取结果集中的列内容
        for (int i = 0; i < rows; i++)
        {
            MYSQL_ROW row = mysql_fetch_row(result);
            for (int j = 0; j < fields; j++)
            {
                cout << row[j] << "\t";
            }
            cout << endl;
        }
        // 获取结果集中数据库的名称和表的名称
        cout << fields_arry[0].db << "  " << fields_arry[0].table << endl;
    }
    // 释放result，关闭连接sock
    ~Mysql()
    {
        mysql_free_result(result);
        mysql_close(mysql_socket);
    }
private:
    MYSQL* mysql_socket;
    MYSQL_RES* result;
    string _cmd;
};

int main()
{
    Mysql a;
    if (a.Sql() == false) exit(-1);
    if (a.GetResult() == false) exit(-1);
    a.GetData();
    return 0;
}

